// 导入lodash-es库中的debounce函数，用于防抖处理
import { debounce } from 'lodash-es'
// 导入vue-command库中的函数，用于创建标准错误输出、标准输出和文本格式化器
import { createStderr, createStdout, textFormatter } from 'vue-command'
// 导入辅助文件中的useFixCursor函数，用于修正光标位置
import { useFixCursor } from './helper.js'

// 获取全局变量$adb，这里是window对象下的adbkit属性
const $adb = window.adbkit

/**
 * 定义一个使用ADB的钩子函数
 * @param {Object} params - 包含vShell、history和loading的对象
 * @returns {Object} 返回包含adb函数的对象
 */
export function useAdb({ vShell, history, loading } = {}) {
  /**
   * 定义一个异步adb函数，用于执行ADB命令
   * @param {Array} args - 命令行参数数组
   * @returns {Promise} 返回一个Promise对象，用于异步执行ADB命令
   */
  const adb = async (args) => {
    // 设置加载状态为true
    loading.value = true

    // 将命令行参数数组（去除第一个元素）拼接成命令字符串
    const command = args.slice(1).join(' ')

    // 使用debounce对vShell的appendToHistory方法进行防抖处理，减少历史记录的更新频率
    const appendToHistory = debounce(vShell.value.appendToHistory, 500)

    // 初始化标准输出和错误输出的文本变量
    let stdoutText = ''
    let stderrText = ''
    // 调用$adb的spawnShell方法执行ADB命令
    $adb.spawnShell(command, {
      // 定义stdout回调函数，处理标准输出
      stdout(text) {
        // 设置加载状态为false
        loading.value = false

        // 将输出文本追加到stdoutText变量中
        stdoutText += text

        // 调用useFixCursor函数修正光标位置
        useFixCursor(history)

        // 调用防抖处理后的appendToHistory方法，将标准输出文本添加到历史记录中
        appendToHistory(createStdout(stdoutText))
      },
      // 定义stderr回调函数，处理错误输出
      stderr(text) {
        // 设置加载状态为false
        loading.value = false

        // 将输出文本追加到stderrText变量中
        stderrText += text

        // 调用useFixCursor函数修正光标位置
        useFixCursor(history)

        // 调用防抖处理后的appendToHistory方法，将错误输出文本添加到历史记录中
        appendToHistory(createStderr(stderrText))
      },
    })

    // 返回格式化后的等待提示信息
    return textFormatter('Waiting...')
  }

  // 返回包含adb函数的对象
  return {
    adb,
  }
}
